﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SIGEB.Modelo.moduloPerfiles;
using SIGEB.Prototipo.Vista.configuracionAvanzada.moduloTipoPerfil;

namespace SIGEB.Prototipo.Vista.moduloPerfiles
{
    public class manejaArbol
    {
        #region "constructores"

        public manejaArbol()
        {
            nodosPadres = new LinkedList<nodoArbol>();
        }

        #endregion

        #region "métodos"

        public void agregarHijos(CheckBox padre, CheckBox[] hijos)
        {
            nodoArbol nuevo = new nodoArbol(padre, seleccionaTodo);
            nuevo.agregarHijos(hijos);
            nodosPadres.AddLast(nuevo);
        }

        private nodoArbol getNodo(int index)
        {
            int count = 0;
            index++;
            foreach (nodoArbol act in nodosPadres)
            {
                count += act.numHijos();
                if (index <= count)
                {
                    int ultPosAnt = count - act.numHijos();
                    index -= ultPosAnt;
                    return act.getHijo(index-1);
                }
                
            }
            throw new IndexOutOfRangeException("índice del nodo inválido");
        }

        public void agregaSelectAll(CheckBox seleccionaTodos)
        {
            this.seleccionaTodo = new nodoArbol(seleccionaTodos, null, nodosPadres);   
        }

        private void CheckedChanged(object sender, EventArgs e)
        {

        }

        public void checkearNodo(int index)
        {
            getNodo(index).seleccionar();
        }

        public void desChekearNodo(int index)
        {
            getNodo(index).desSeleccionar();
        }

        public void chekearNodoPadre(int index)
        {
            nodosPadres.ElementAt(index).seleccionarAuto();
        }

        public void desChekearNodoPadre(int index)
        {
            nodosPadres.ElementAt(index).desSeleccionarAuto();
        }

        public void ingresarPermisos(string permisos)
        {
            if (!String.IsNullOrEmpty(permisos))
            {
                permisosClass p = new permisosClass(permisos);
                foreach (nodoArbol actual in nodosPadres)
                {
                    actual.marcaPermisos(p);
                }
            }
            else
            {
                vaciarCampos();
            }
        }

        public void vaciarCampos()
        {
            seleccionaTodo.desSeleccionar();
        }

        public string leerPermisos()
        {
            permisosClass a = new permisosClass("");
            foreach (nodoArbol act in nodosPadres)
            {
                act.leerPermiso(a);
            }
            return a.permisos;
        }

        public void desActivar()
        {
            seleccionaTodo.desActivar();
        }

        public void Activar()
        {
            seleccionaTodo.Activar();
        }

        #endregion

        #region "atributos"
        
        LinkedList<nodoArbol> nodosPadres;
        nodoArbol seleccionaTodo;

        #endregion
    }

}
